package com.example.sulingorder.rabbitlistener;

import com.alibaba.nacos.common.utils.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.sulingorder.conster.RedisConster;
import com.example.sulingorder.entity.OrderEntity;
import com.example.sulingorder.service.OrderService;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

/**
 * @author: 1322127758@qq.com
 * @date: 2022/3/30 22:53
 * @RabbitListener(""): 参数要监听的队列名
 * @作用: 监听 过期后的消息
 */
@Component
@RabbitListener(queues = {"suling.queue"})
public class ExpiredQueueListener {
    @Autowired
    private StringRedisTemplate redisTemplate;

    @Autowired
    private OrderService orderService;

    /**
     * 处理用户发布的订单, 只处理未领取的订单, 将订单改为过期的, 将redis中的订单数据删除
     * @param message :消息发过来的完整信息,包含消息内容
     * @param key :按类型直接取消息内容, 用户号 : 订单号  这个是订单在redis中的key
     * @param channel :连接通道
     */
    @RabbitHandler
    public void upOrderState(Message message, String key, Channel channel){
        try{
            String orderSn = key.split(" ")[1];
            //查看当前订单在数据库中的状态,如果是未领状态,就修改
            OrderEntity one = orderService.getOne(new QueryWrapper<OrderEntity>().eq("or_order_sn", orderSn).eq("or_order_state", 0));
            //修改订单状态
            if(null != one){
                one.setOrOrderState(3);
                boolean b = orderService.updateById(one);
                if(b){
                    /*
                     * basicAck()确认签收函数
                     * 参数一:每个消息都有一个自增的id,参数就是说这个id的消息以接收到了
                     * 参数二:是否批量确认 一般设置false  因为当前id不能代表所以信息  可能处理下一个消息的时候关机了
                     */
                    channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
                }
            }else{
                /*
                 * basicAck()确认签收函数
                 * 参数一:每个消息都有一个自增的id,参数就是说这个id的消息以接收到了
                 * 参数二:是否批量确认 一般设置false  因为当前id不能代表所以信息  可能处理下一个消息的时候关机了
                 */
                channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
            }

            String s = redisTemplate.opsForValue().get(RedisConster.ORDER_KEY + key);
            //如果redis中的订单数据不为null删除数据
            if (!StringUtils.isEmpty(s)){
                Boolean delete = redisTemplate.delete(RedisConster.ORDER_KEY + key);
            }

        }catch(Exception e){
            //网络异常
        }
    }
}
